import numpy as np
arr1 = np.arange(10)
# 当明确知道从第 x 个元素切到第 y 个元素，如示例所示。
print(arr1)
# 从索引[1]开始，切到索引[4]之前
print(arr1[1:4]) # [1 2 3]
# 从索引[1]开始，切到结尾
print(arr1[1:]) # [1 2 3 4 5 6 7 8 9]
# 从数组开头开始，切到索引[4]之前
print( arr1[ : 4 ] ) # [0 1 2 3]
# 当明确切除数组的开头与结尾，如示例所示。
arr1 = np.arange(10)
print(arr1) # [0 1 2 3 4 5 6 7 8 9]
# 切除开头 2 个和结尾 2 个
print( arr1[ 2 : -2 ] ) # [2 3 4 5 6 7]
# 切除开头 2 个
print( arr1[ 2 : ] ) # [2 3 4 5 6 7 8 9]
# 切除结尾 2 个
print( arr1[ : -2 ] ) # [0 1 2 3 4 5 6 7]

# 当明确隔几个元素采样一次时，示例如下。
arr1 = np.arange(10)
print(arr1) # [0 1 2 3 4 5 6 7 8 9]
# 每 2 个元素采样一次
print(arr1[::2]) #[0 2 4 6 8]
# 每 3 个元素采样一次
print(arr1[::3]) # [0 3 6 9]
# 切除一头一尾后，每 2 个元素采样一次
print( arr1[ 1 : -1 : 2 ] ) # [1 3 5 7]

# 矩阵的切片
arr2 = np.arange(1,21).reshape(4,5)
print(arr2)
"""
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [11 12 13 14 15]
 [16 17 18 19 20]]
"""
# 矩阵切片初体验
print( arr2[ 1:3 , 1:-1 ] )
"""
[[ 7  8  9]
 [12 13 14]]
"""
# 跳跃采样
print( arr2[ ::3 , ::2 ] )
"""
[[ 1  3  5]
 [16 18 20]]
"""

# 提取矩阵的行
arr3 = np.arange(1,21).reshape(4,5)
print( arr3 )
"""
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [11 12 13 14 15]
 [16 17 18 19 20]]
"""
# 提取第 2 行 提取一行直接变成向量了，节省空间
print( arr3[ 2 , : ] ) # [11 12 13 14 15]
# 提取 1 至 2 行
print( arr3[ 1:3 , : ] )
"""
[[ 6  7  8  9 10]
 [11 12 13 14 15]]
"""
# 考虑代码的简洁，当提取矩阵的某几行时可简写（但提取列的时候不可简写）。
# 规范的提取行
print( arr3[ 2 , : ] ) # [11 12 13 14 15]
# 简便的提取行
print( arr3[2] ) # [11 12 13 14 15]

# 提取矩阵的列
arr4 = np.arange(1,21).reshape(4,5)
print(arr4)
"""
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [11 12 13 14 15]
 [16 17 18 19 20]]
"""
# 跟提取行一样，如果提取列，且为一列，提取到的是向量
# 提取第二列
print(arr4[:,2]) # [ 3  8 13 18]
# 提取 1至2列
print(arr4[:,1:3])
"""
[[ 2  3]
 [ 7  8]
 [12 13]
 [17 18]]
"""

arr5 = np.arange(1,16).reshape(3,5)
print( arr5 )
"""
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [11 12 13 14 15]]
"""
# 提取第 2 列为向量
cut = arr5[:,2]
print(cut) # [ 3  8 13]
# 转换为列矩阵，就是多行一列
print(cut.reshape(-1,1))
"""
[[ 3]
 [ 8]
 [13]]
"""
# 转换为行矩阵，就是一行多列
print(cut.reshape(1,-1)) # [[ 3  8 13]]
